const Redis = require('ioredis');

// 创建一个新的 Redis 实例  
const redis = new Redis({
  "host": "127.0.0.1",
  "port": "6379",
  // 重连策略  
  retryStrategy: function (times) {
    // times 表示这是第几次重连  
    // 返回重连之前等待的毫秒数  
    // 示例：第一次重连等待1秒，之后每次递增1秒  
    let delay = Math.min(times * 1000, 10000);
    return delay;
  }
});
let listName = 'liuyanban'

// 使用 Promise 进行异步操作  
// redis.set('foo', 'bar1234567')
//   .then(() => redis.get('foo'))
//   .then(result => {
//     console.log(result); // 输出: 'bar'  
//   })
//   .catch(error => {
//     console.error('Error:', error);
//   });
// 另一种方式是使用 async/await  
// async function example() {
//   try {
//     await redis.set('foo', 'baz098765432');
//     const value = await redis.get('foo');
//     console.log(value); // 输出: 'baz'  
//   } catch (error) {
//     console.error('Error:', error);
//   }
// }
// example();

// 监听 ready 事件  
redis.on('ready', () => {
  console.log('Redis 客户端已连接');
  // 在这里执行需要连接成功后才能进行的操作  
});

// 监听 error 事件以处理连接错误  
redis.on('error', (error) => {
  console.error('Redis 客户端连接错误:', error);
  // throw new Error('redis连接异常~~')
});

redis.on('connect', () => {
  console.log('Redis connected');
});

redis.on('reconnecting', (times) => {
  console.log(`Redis is reconnecting, attempt ${times}`);
});

redis.on('end', () => {
  console.log('Redis connection has ended');
});


// 当应用程序退出时，关闭 Redis 连接  
process.on('exit', () => {
  console.log(`======== close `,)
  redis.disconnect();
});
// ================================
// ================================
// ================================

// 增（LPUSH，在列表左侧插入元素）
let lpush = (data = {}, callback = Function) => {
  data = JSON.stringify(data);
  redis.lpush(listName, data)
    .then(() => { callback() })
    .catch(err => { callback(true, err) })
}
// lpush({ ljdosf: 21234 }, err => {
//   if (err) { console.log(`llll`,) }
//   else console.log(`====`,)
// })

// 查（LRANGE，获取列表中的元素）
// 获取最后一个数据： lrange( -1, -1)
let lrange = (start = 0, end = 0, callback = Function) => {
  // let res = await redis.lrange(listName, start, end) // 获取所有元素
  // return res
  redis.lrange(listName, start, end)
    .then((response) => { callback(false, response) })
    .catch(err => { callback(true, err) })
}
// lrange(0, 1, (err, response) => {
//   if (err) { console.log(`llll`,) }
//   else console.log(`====`, response)
// })
// lrange(-1, -1, (err, response) => {
//   if (err) { console.log(`llll`,) }
//   else console.log(`====`, response)
// })

// 获取List长度
let llen = (callback = Function) => {
  redis.llen(listName)
    .then((response) => { callback(false, response) })
    .catch(err => { callback(true, err) })
}
// llen((err, response) => {
//   if (err) { console.log(`llll`,) }
//   else console.log(`====`, response)
// })

// 使用RPOP从列表右侧移除并返回一个元素
let rpop = (callback = Function) => {
  redis.rpop(listName)
    .then((response) => { callback(false, response) })
    .catch(err => { callback(true, err) })
}
// rpop((err, response) => {
//   if (err) { console.log(`llll`,) }
//   else console.log(`====`, response)
// })


// 定时删除过期的留言板
function deleteListOne() {
  lrange(-1, -1, (err, response) => {
    if (err) { console.log(`获取最后一个数据失败`, err) }
    else {
      // console.log(`====`, response)
      let data = JSON.parse(response[0])
      if (response.length && data.vavlidity) {
        if (Number(data.vavlidity) < new Date().getTime()) {
          rpop((err, response) => {
            if (err) {
              console.log(`删除最后一个元素失败`, err)
            }
            else {
              // console.log(`删除最后一个元素成功`, response);
              deleteListOne();
            }
          })
        }
      }
    }
  })
}
setInterval(() => {
  deleteListOne();
}, 1000 * 60 * 10);


module.exports = {
  redis_cli: redis,
  lpush,
  lrange,
  llen,
  rpop,
}